home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / find2.i < prev    next >
Text File  |  1997-10-26  |  20KB  |  872 lines

  1. IMPLEMENTATION MODULE Find2;
  2.  
  3.  
  4. FROM SYSTEM IMPORT ADDRESS, ASSEMBLER, TSIZE;
  5. IMPORT Char, Storage;
  6.  
  7.  CONST
  8.   TSizeTPattern = TSIZE (tPattern);
  9.   xyz = 20;
  10.  
  11. (*
  12. ;: (* (c) 3/1992 Andreas Alich *)
  13.  
  14. ;: FROM Find2 IMPORT
  15. ;:  tPattern AS tPattern_,
  16. ;:  tPat AS tPat_;
  17. ;: CONST
  18. ;:  TSIZE_tPattern = TSIZE (tPattern);
  19. ;.
  20. *)
  21.  
  22. (* __optimize set TRUE *)
  23.  
  24.  PROCEDURE Compile (VAR pattern: ARRAY OF CHAR; any, all, all_but_eol, eol: CHAR;
  25.           cap, backward: BOOLEAN): tpPattern;
  26.  
  27. (* PREFIX com_;
  28.  REG
  29.     D2/
  30.     D3/ (* * (all_but_eol) *)
  31.     D4/ (* Anfang des Teilmusters *)
  32.     D5/ (* 1 + Position des letzten/ersten ?, das nicht an
  33.          letzter/erster Stelle steht *)
  34.     D6/ (* ? (any) *)
  35.     D7/ (* @ (all) *)
  36.     A2/ (* aktuelles Pat *)
  37.     A3/
  38.     A4/
  39.     A5; (* Adresse des Nachfolgerzeigers *)
  40.  LINK A6;
  41. *)
  42.  VAR
  43.     pPattern: tpPattern;
  44.     pEnd: ADDRESS;
  45.     regA3 : ADDRESS;
  46.  
  47.    BEGIN (* PROC Compile *)
  48.     ASSEMBLER
  49.     MOVEM.L   D0-A6,-(A7)
  50.     MOVE.L  A3,regA3(A6)
  51.  
  52. com_0:
  53.     LEA     pPattern(A6),A0
  54.     MOVEM.L D0-A6,-(SP)
  55.     MOVE.L  A0,(A3)+
  56.     MOVE.L  #TSizeTPattern,(A3)+
  57.     JSR     Storage.ALLOCATE
  58.     MOVEM.L (SP)+,D0-A6
  59.  
  60.     MOVEA.L pPattern(A6),A0
  61.  
  62.     CLR.L   tPattern.pFirst(A0)
  63.     CLR.L   tPattern.pLast(A0)
  64.     MOVE.B  any(A6),D6
  65.     MOVE.B  D6,tPattern.any(A0)
  66.     MOVE.B  all(A6),D7
  67.     MOVE.B  all_but_eol(A6),D3
  68.     MOVE.W  backward(A6),tPattern.backward(A0)
  69.     LEA     tPattern.pFirst(A0),A5
  70.     SUBA.L  A2,A2       ;Initialisierung, falls Muster leer
  71.     MOVE.L  pattern(A6),pEnd(A6)
  72. com_1:
  73.     MOVE.L  pEnd(A6),A0
  74.     MOVEQ   #NIL,D5
  75. com_2:
  76.     MOVE.B  (A0)+,D0
  77.     CMP.B   D0,D7
  78.     BEQ.S   com_2       ;fhrende @ ...
  79.     CMP.B   D0,D3
  80.     BEQ.S   com_2       ;... und * berlesen
  81.     SUBQ.W  #1,A0
  82.     MOVE.L  A0,D4
  83. com_4:
  84.     MOVE.B  (A0)+,D0
  85.     BEQ.S   com_8
  86.     CMP.B   D0,D7       ;@
  87.     BEQ.S   com_8
  88.     CMP.B   D0,D3       ;*
  89.     BNE.S   com_4
  90. com_8:
  91.     SUBQ.W  #1,A0
  92.     MOVE.L  A0,pEnd(A6);Position des Trennsymbols (@/*/0C)
  93.     SUBA.L  D4,A0       ;Teilmusterl„nge
  94.     MOVE.W  A0,D2
  95.     BEQ.W   com_30      ;leeres Muster
  96.     
  97. ;   PEA     tPat.pattern+1(A0)  ;Rec.gr”áe bis pattern + Musterl„nge+1
  98.     MOVEM.L D0-A6,-(SP)
  99.     MOVE.L  regA3(A6),A3
  100.     MOVE.L  A5,(A3)+
  101.     LEA     tPat.pattern+1(A0),A1
  102.     MOVE.L  A1,(A3)+
  103.     JSR     Storage.ALLOCATE
  104.     MOVEM.L (SP)+,D0-A6
  105.     
  106.     MOVEA.L (A5),A2
  107.     CLR.L   tPat.pPrev(A2)
  108.     CLR.L   tPat.pNext(A2)
  109.     MOVE.W  D2,tPat.len(A2)
  110.     MOVE.B  eol(A6),tPat.eol(A2)
  111.     CLR.W   tPat.idx(A2)
  112.     LEA     tPat.pNext(A2),A5
  113.  
  114.     LEA     tPat.pattern(A2),A3
  115.     TST.W   backward(A6)
  116.     BNE.S   com_62
  117.     CLR.B   (A3)+
  118. com_62:
  119.     TST.W   cap(A6)
  120.     BNE.S   com_65
  121.     MOVE.W  D2,D1
  122.     SUBQ.W  #1,D1
  123.     MOVEA.L D4,A0
  124. com_61:
  125.     MOVE.B  (A0)+,(A3)+
  126.     DBRA    D1,com_61
  127.     BRA.S   com_69
  128. com_65:
  129.     JSR     Char.pUpper/
  130.     MOVEA.L D0,A4
  131.  
  132.     MOVE.W  D2,D1
  133.     SUBQ.W  #1,D1
  134.     MOVEA.L D4,A0
  135.     MOVEQ   #0,D0
  136. com_66:
  137.     MOVE.B  (A0)+,D0
  138.     CMP.B   D0,D6       ;?
  139.     BEQ.S   com_67
  140.     MOVE.B  0(A4,D0.W),D0    ;Cap
  141. com_67:
  142.     MOVE.B  D0,(A3)+
  143.     DBRA    D1,com_66
  144. com_69:
  145.     TST.W   backward(A6)
  146.     BEQ.S   com_63
  147.     CLR.B   (A3)+
  148. com_63:
  149.     MOVE.L  pEnd(A6),A0
  150.     CMP.B   (A0),D3     ;* als Trennsymbol
  151.     SEQ     tPat.no_eol(A2)
  152.     TST.W   backward(A6)
  153.     BNE.W   com_40
  154.  
  155.     MOVEQ   #4,D1
  156.     LEA     tPat.pattern+1(A2),A1 ;(fhrendes 0C!)
  157.     CMP.B   -1(A1,D2.W),D6  ;letztes Zeichen mit ? vgl.
  158.     BNE.S   com_19
  159.     MOVE.W  D1,tPat.idx(A2) ;Muster enth„lt ?
  160. com_19:
  161.     MOVE.W  D2,D0
  162.     SUBQ.W  #2,D0
  163.     BMI.S   com_21      ;Musterl„nge 1
  164. ; Untersuchung der ersten n-1 Zeichen
  165. com_11:
  166.     CMP.B   (A1)+,D6        ;?
  167.     BNE.S   com_17
  168.     MOVE.L  A1,D5       ;Position des (letzten) ? merken
  169.     MOVE.W  D1,tPat.idx(A2) ;Muster enth„lt ?
  170. com_17:
  171.     DBRA    D0,com_11
  172. com_21:
  173.     TST.L   D5
  174.     BEQ.S   com_10      ;kein ?
  175.     LEA     tPat.pattern+1(A2),A0 ;(fhrendes 0C!)
  176.     ADDA.W  D2,A0
  177.     SUBA.L  D5,A0       ;#Zeichen nach ?
  178.     MOVE.W  A0,D2
  179. com_10:
  180.     MOVE.B  D2,D1
  181.     LSL.W   #8,D1
  182.     MOVE.B  D2,D1
  183.     MOVE.W  D1,D0
  184.     SWAP    D1
  185.     MOVE.W  D0,D1
  186.     MOVEQ   #15,D0
  187.     LEA     tPat.d(A2),A0
  188. com_12:
  189.     MOVE.L  D1,(A0)+
  190.     MOVE.L  D1,(A0)+
  191.     MOVE.L  D1,(A0)+
  192.     MOVE.L  D1,(A0)+
  193.     DBRA    D0,com_12
  194.  
  195.     SUBQ.W  #1,D2
  196.     BNE.S   com_13      ;(relevante) Musterl„nge > 1
  197.     TST.W   cap(A6)
  198.     BEQ     com_1
  199.     ADDQ.W  #2,tPat.idx(A2) ;groá/klein beim Vgl. ignorieren
  200.     BRA     com_1
  201. com_13:
  202.     LEA     tPat.pattern+1(A2),A1 ;(fhrendes 0C!)
  203.     MOVE.L  D5,D0
  204.     BEQ.S   com_14
  205. ; Zeichen bis zum letzten ? ver„ndern d nicht
  206.     MOVEA.L D5,A1
  207. com_14:
  208.     LEA     tPat.d(A2),A3
  209.     TST.W   cap(A6)
  210.     BNE.S   com_20
  211. ; d gem„ž den Zeichen nach dem letzten ? anpassen
  212.     MOVEQ   #0,D0
  213. com_16:
  214.     MOVE.B  (A1)+,D0
  215.     MOVE.B  D2,0(A3,D0.W)
  216.     SUBQ.B  #1,D2
  217.     BNE.S   com_16
  218.     BRA     com_1
  219.  
  220. com_20:
  221.     ADDQ.W  #2,tPat.idx(A2) ;groá/klein beim Vgl. ignorieren
  222.     MOVE.L  A1,-(A7)
  223.     JSR     Char.pLower/
  224.     MOVEA.L D0,A4
  225.     MOVE.L  (A7)+,A1
  226.  
  227.     MOVEQ   #0,D0
  228. ; d gem„ž den Zeichen nach dem letzten ? anpassen
  229. com_26:
  230.     MOVE.B  (A1)+,D0        ;bereits Cap
  231.     MOVE.B  D2,0(A3,D0.W)
  232.     MOVE.B  0(A4,D0.W),D0    ;Lower
  233.     MOVE.B  D2,0(A3,D0.W)
  234.     SUBQ.B  #1,D2
  235.     BNE.S   com_26
  236.     BRA     com_1
  237.  
  238.  
  239. com_40:
  240. ; Rckw„rtssuche
  241.     MOVEQ   #4,D1
  242.     LEA     tPat.pattern(A2),A1
  243.     CMP.B   (A1),D6     ;erstes Zeichen mit ? vgl.
  244.     BNE.S   com_43
  245.     MOVE.W  D1,tPat.idx(A2) ;Muster enth„lt ?
  246. com_43:
  247.     MOVE.W  D2,D0
  248.     SUBQ.W  #2,D0
  249.     BMI.S   com_48      ;Musterl„nge 1
  250. ; Untersuchung der letzten n-1 Zeichen
  251.     ADDA.W  D2,A1
  252. com_41:
  253.     CMP.B   -(A1),D6        ;?
  254.     BNE.S   com_47
  255.     MOVE.L  A1,D5       ;Position des (ersten) ? merken
  256.     MOVE.W  D1,tPat.idx(A2) ;Muster enth„lt ?
  257. com_47:
  258.     DBRA    D0,com_41
  259. com_48:
  260.     TST.L   D5
  261.     BEQ.S   com_49      ;kein ?
  262.     MOVE.L  D5,D2
  263.     LEA     tPat.pattern(A2),A0
  264.     SUB.L   A0,D2       ;#Zeichen vor ?
  265. com_49:
  266.     MOVE.B  D2,D1
  267.     LSL.W   #8,D1
  268.     MOVE.B  D2,D1
  269.     MOVE.W  D1,D0
  270.     SWAP    D1
  271.     MOVE.W  D0,D1
  272.     MOVEQ   #15,D0
  273.     LEA     tPat.d(A2),A0
  274. com_42:
  275.     MOVE.L  D1,(A0)+
  276.     MOVE.L  D1,(A0)+
  277.     MOVE.L  D1,(A0)+
  278.     MOVE.L  D1,(A0)+
  279.     DBRA    D0,com_42
  280.  
  281.     SUBQ.W  #1,D2
  282.     BNE.S   com_45      ;(relevante) Musterl„nge > 1
  283.     TST.W   cap(A6)
  284.     BEQ     com_1
  285.     ADDQ.W  #2,tPat.idx(A2) ;groá/klein beim Vgl. ignorieren
  286.     BRA     com_1
  287. com_45:
  288.     LEA     tPat.pattern+1(A2),A1 ;(D2 wurde um 1 verringert)
  289.     ADDA.W  D2,A1
  290.     LEA     tPat.d(A2),A3
  291.     TST.W   cap(A6)
  292.     BNE.S   com_50
  293. ; d gem„ž den Zeichen vor dem ersten ? anpassen
  294.     MOVEQ   #0,D0
  295. com_46:
  296.     MOVE.B  -(A1),D0
  297.     MOVE.B  D2,0(A3,D0.W)
  298.     SUBQ.B  #1,D2
  299.     BNE.S   com_46
  300.     BRA     com_1
  301.  
  302. com_50:
  303.     ADDQ.W  #2,tPat.idx(A2) ;groá/klein beim Vgl. ignorieren
  304.     MOVE.L  A1,-(A7)
  305.     JSR     Char.pLower/
  306.     MOVEA.L D0,A4
  307.     MOVE.L  (A7)+,A1
  308.  
  309.     MOVEQ   #0,D0
  310. ; d gem„ž den Zeichen vor dem ersten ? anpassen
  311. com_56:
  312.     MOVE.B  -(A1),D0        ;bereits Cap
  313.     MOVE.B  D2,0(A3,D0.W)
  314.     MOVE.B  0(A4,D0.W),D0    ;Lower
  315.     MOVE.B  D2,0(A3,D0.W)
  316.     SUBQ.B  #1,D2
  317.     BNE.S   com_56
  318.     BRA     com_1
  319.  
  320.  
  321. com_30:
  322. ; Rckw„rtsverkettung erstellen
  323.     MOVE.L  pPattern(A6),A0
  324.     MOVE.L  A2,tPattern.pLast(A0)   ;ggf. NIL
  325.     MOVE.L  tPattern.pFirst(A0),D0
  326.     BEQ.S   com_35          ;kein Pat vorhanden
  327.     MOVEA.L D0,A0
  328. com_32:
  329.     MOVE.L  tPat.pNext(A0),D0
  330.     BEQ.S   com_34
  331.     MOVEA.L D0,A1
  332.     MOVE.L  A0,tPat.pPrev(A1)
  333.     MOVE.L  A1,A0
  334.     BRA.S   com_32
  335. com_35:
  336.     LEA     tPattern.pFirst(A0),A1
  337.  
  338.     MOVEM.L D0-A6,-(SP)
  339.     MOVE.L  regA3(A6),A3
  340.     MOVE.L  A1,(A3)+                    ; Adresse von pFirst
  341.     MOVE.W  tPat.len(A2),D0
  342.     EXT.L   D0
  343.     ADDQ.L  #2,D0
  344.     MOVE.L  D0,(A3)+                    ; L„nge berechnen 
  345.     MOVEM.L A0-A6,-(A7)
  346.     JSR     Storage.ALLOCATE
  347.     MOVEM.L (SP)+,D0-A6
  348.  
  349. ;    PEA     (tPat.len+2).W
  350. ;    MOVEA.L A0,A3
  351. ;    PEA tPattern_pFirst(A3)
  352. ;    CALL    Storage.ALLOCATE
  353.  
  354.     MOVEA.L tPattern.pFirst(A0),A2
  355.     CLR.L   tPat.pPrev(A2)
  356.     CLR.L   tPat.pNext(A2)
  357.     CLR.W   tPat.len(A2)
  358.     MOVE.L  A2,tPattern.pLast(A3)
  359. com_34:
  360.     MOVE.L  pPattern(A6),D0
  361. com_ret:
  362.     MOVEM.L (A7)+,D0-A6
  363.     
  364.     ; Sprungtabellen initialisieren: 
  365.     CLR.L   (A3)+
  366.     CLR.L   (A3)+
  367.     CLR.L   (A3)+
  368.     CLR.L   (A3)+
  369.     JSR     Find/
  370.     END;
  371.     RETURN pPattern
  372.    END (*PROC*)  Compile;
  373.  
  374.  
  375. PROCEDURE Find (Text: ADDRESS; (* Anfangsadresse des zu durchsuchenden Textes *)
  376.           TextLen: LONGINT; (* Gesamtl„nge des Textes *)
  377.           p: tpPattern; (* Zeiger auf vorcompiliertes Suchmuster *)
  378.           Start: LONGINT (* Such-Startposition im Text *)
  379.           ): BOOLEAN;
  380.  
  381.  
  382. (*
  383. ;: PREFIX f_;
  384. ;: REG
  385. ;:  D2/
  386. ;:  D3/ (* (any) *)
  387. ;:  D4/ (* Null *)
  388. ;:  D6/ (* pPatternEnd *)
  389. ;:  D7/ (* pEnd *)
  390. ;:  A2/ (* (pMatch) *)
  391. ;:  A3/ (* d *)
  392. ;:  A4/ (* Cap *)
  393. ;:  A5/ (* pPat *)
  394. ;:  A6; (* Cmp *)
  395. ;.
  396. *) VAR erg : BOOLEAN;
  397.    BEGIN (*PROC Find *)
  398.    ASSEMBLER
  399.     MOVEM.L D0-A6,-(A7)
  400.  
  401.     MOVE.L  p(A6),A2
  402.     CMPA.L  #0,A2
  403.     BEQ.W   f_init
  404.     MOVE.L  tPattern.pFirst(A2),D0
  405.     MOVEA.L D0,A0
  406.     TST.W   tPat.len(A0)
  407.     BNE.S   f_1
  408. ; leeres Muster
  409.     MOVE.L  Text(A6),D0
  410.     BEQ.W   f_false
  411.     ADD.L   Start(A6),D0
  412.     MOVE.L  D0,tPat.pMatch(A0)
  413.     BRA.W   f_true
  414. f_1:
  415.     MOVE.L  Text(A6),A1
  416.     MOVE.L  A1,D7
  417.     TST.W   tPattern.backward(A2)
  418.     BNE.W   fb_1
  419.  
  420.     MOVE.L  Start(A6),D2
  421.     ADDA.L  D2,A1       ;Startposition im Text
  422.     MOVE.L  A1,D3
  423. ff_0:
  424.     MOVEA.L D0,A0
  425.     ADDA.W  tPat.len(A0),A1
  426.     MOVE.L  A1,tPat.pMatch(A0)  ;zun„chst Zeiger hinter Match
  427.     MOVE.L  tPat.pNext(A0),D0
  428.     BNE.S   ff_0
  429.  
  430.     MOVE.L  TextLen(A6),D1
  431.     ADD.L   D1,D7
  432.     SUB.L   D2,D1       ;Textl„nge ab Suchstart
  433.     BLE.W   f_false
  434.     SUBA.L  D3,A1       ;Gesamtl„nge der Teilmuster
  435.     CMPA.L  D1,A1
  436.     BGT.W   f_false     ;Muster l„nger als Rest des Textes
  437.  
  438.     MOVEQ   #0,D4
  439.     MOVE.B  tPattern.any(A2),D3
  440.     JSR     Char.pUpper/
  441.     MOVEA.L D0,A4
  442.     MOVE.L  tPattern.pLast(A2),A5
  443.     MOVE.L  D7,tPat.pLimit(A5)
  444.     MOVEQ   #0,D1
  445. ff_3:
  446.     MOVEA.L tPat.pMatch(A5),A2
  447.     LEA     tPat.d(A5),A3
  448.     MOVE.L  tPat.pLimit(A5),D7
  449.     TST.B   D1
  450.     BEQ.S   ff_2
  451.     MOVE.L  D7,A0
  452.     MOVE.B  tPat.eol(A5),D0
  453. ff_4:
  454.     CMP.B   -(A0),D0
  455.     BEQ.S   ff_5
  456.     CMPA.L  A2,A0
  457.     BHI.S   ff_4
  458.     BRA.S   ff_2
  459. ff_5:
  460.     LEA 1(A0),A2
  461. ff_2:
  462.     LEA     tPat.pattern-1(A5),A0
  463.     ADDA.W  tPat.len(A5),A0
  464.     MOVE.L  A0,D6
  465.     ADDQ.L  #2,D6
  466. ;alt: 
  467. ;    LEA     fcmpTable(PC),A0
  468. ;    MOVE.W  tPat.idx(A5),D0
  469. ;    ADDA.W  (A0,D0.W),A0
  470.     LEA     fcmpTable(PC),A0
  471.     MOVE.W  tPat.idx(A5),D0
  472.     LSL.W   #1,D0
  473.     ADDA.W  D0,A0
  474.     MOVE.L  (A0),A0
  475.     JMP     (A0)
  476.  
  477. ff_7:
  478. ; keine šbereinstimmung
  479.     MOVE.L  tPat.pNext(A5),D0
  480.     BEQ.S   f_false     ;kein Nachfolger -> Suche erfolglos
  481.     MOVEA.L D0,A5
  482.     MOVEA.L tPat.pMatch(A5),A2
  483.     LEA     tPat.d(A5),A3
  484.     MOVE.L  tPat.pLimit(A5),D7
  485.     MOVE.B  -1(A2),D4
  486.     MOVE.B  0(A3,D4.W),D4
  487.     ADDA.W  D4,A2
  488.     CMPA.L  D7,A2
  489.     BHI.S   ff_7
  490.     BRA.S   ff_2        ;Suche mit Nachfolger fortsetzen
  491. ff_6:
  492. ; šbereinstimmung
  493.     MOVE.L  A2,tPat.pMatch(A5)
  494.     MOVE.L  tPat.pPrev(A5),D0
  495.     BEQ.S   ff_10       ;Alle Teilmuster passen
  496.     MOVEA.L A2,A0
  497.     SUBA.W  tPat.len(A5),A0
  498.     MOVE.L  D0,A5
  499.     MOVE.B  tPat.no_eol(A5),D1
  500.     MOVE.L  A0,tPat.pLimit(A5)
  501.     BRA.S   ff_3        ;Suche mit Vorg„nger fortsetzen
  502. ff_10:
  503.     MOVEQ   #0,D1
  504. ; pMatch-Zeiger jeweils auf den Anfang des gef. Teilmusters setzen
  505. ff_11:
  506.     MOVE.W  tPat.len(A5),D1
  507.     SUB.L   D1,tPat.pMatch(A5)
  508.     MOVE.L  tPat.pNext(A5),D0
  509.     BEQ.W   f_true
  510.     MOVEA.L D0,A5
  511.     BRA.S   ff_11
  512.  
  513. f_false:
  514.     MOVE.W  #FALSE,erg(A6)
  515.     BRA.W   f_endproc
  516. f_true:
  517.     MOVE.W  #TRUE,erg(A6)
  518. f_ret:
  519.     BRA.W   f_endproc;
  520.  
  521. f_init:
  522.    (* Init der Sprungtabellen: *)
  523.     LEA     fcmpTable(PC),A0
  524.     LEA     Fwd(PC),A1
  525.     MOVE.L  A1,(A0)+
  526.     LEA     FwdCap(PC),A1
  527.     MOVE.L  A1,(A0)+
  528.     LEA     FwdAny(PC),A1
  529.     MOVE.L  A1,(A0)+
  530.     LEA     FwdCapAny(PC),A1
  531.     MOVE.L  A1,(A0)+
  532.     LEA     bcmpTable(PC),A0
  533.     LEA     Bwd(PC),A1
  534.     MOVE.L  A1,(A0)+
  535.     LEA     BwdCap(PC),A1
  536.     MOVE.L  A1,(A0)+
  537.     LEA     BwdAny(PC),A1
  538.     MOVE.L  A1,(A0)+
  539.     LEA     BwdCapAny(PC),A1
  540.     MOVE.L  A1,(A0)+
  541.  
  542.     MOVE.W  #FALSE,erg(A6)
  543.     BRA.W   f_endproc
  544.     
  545. Fwd:
  546. ff_14:
  547.     MOVEA.L A2,A0       ;Text
  548.     MOVEA.L D6,A1       ;Muster
  549. ff_15:
  550.     MOVE.B  -(A1),D0
  551.     BEQ.W   ff_6        ;Muster stimmt mit Text berein
  552.     CMP.B   -(A0),D0
  553.     BEQ.S   ff_15
  554.     MOVE.B  -1(A2),D4
  555.     MOVE.B  0(A3,D4.W),D4
  556.     ADDA.W  D4,A2
  557.     CMPA.L  D7,A2
  558.     BLS.S   ff_14
  559.     BRA.W   ff_7
  560.  
  561. FwdCap:
  562. ff_24:
  563.     MOVEA.L A2,A0       ;Text
  564.     MOVEA.L D6,A1       ;Muster
  565. ff_25:
  566.     MOVE.B  -(A1),D0
  567.     BEQ.W   ff_6        ;Muster stimmt mit Text berein
  568.     MOVE.B  -(A0),D4
  569.     CMP.B   0(A4,D4.W),D0
  570.     BEQ.S   ff_25
  571.     MOVE.B  -1(A2),D4
  572.     MOVE.B  0(A3,D4.W),D4
  573.     ADDA.W  D4,A2
  574.     CMPA.L  D7,A2
  575.     BLS.S   ff_24
  576.     BRA ff_7
  577.  
  578. FwdAny:
  579. ff_34:
  580.     MOVEA.L A2,A0       ;Text
  581.     MOVEA.L D6,A1       ;Muster
  582. ff_35:
  583.     MOVE.B  -(A1),D0
  584.     BEQ ff_6        ;Muster stimmt mit Text berein
  585.     CMP.B   D0,D3
  586.     BEQ.S   ff_36       ;?
  587.     CMP.B   -(A0),D0
  588.     BEQ.S   ff_35
  589.     MOVE.B  -1(A2),D4
  590.     MOVE.B  0(A3,D4.W),D4
  591.     ADDA.W  D4,A2
  592.     CMPA.L  D7,A2
  593.     BLS.S   ff_34
  594.     BRA ff_7
  595. ff_36:
  596.     SUBQ.W  #1,A0
  597.     BRA.S   ff_35
  598.  
  599. FwdCapAny:
  600. ff_44:
  601.     MOVEA.L A2,A0       ;Text
  602.     MOVEA.L D6,A1       ;Muster
  603. ff_45:
  604.     MOVE.B  -(A1),D0
  605.     BEQ ff_6        ;Muster stimmt mit Text berein
  606.     MOVE.B  -(A0),D4
  607.     CMP.B   D0,D3
  608.     BEQ.S   ff_45       ;?
  609.     CMP.B   0(A4,D4.W),D0
  610.     BEQ.S   ff_45
  611.     MOVE.B  -1(A2),D4
  612.     MOVE.B  0(A3,D4.W),D4
  613.     ADDA.W  D4,A2
  614.     CMPA.L  D7,A2
  615.     BLS.S   ff_44
  616.     BRA ff_7
  617.  
  618.  
  619. ;*---------------------------------------
  620. fb_1:
  621.     MOVE.L  Start(A6),D2
  622.     BMI     f_false     ;neg. Startposition
  623.  
  624.     MOVEA.L TextLen(A6),A3
  625. fb_8:
  626.     MOVEA.L D0,A0
  627.     SUBA.W  tPat.len(A0),A3
  628.     MOVE.L  tPat.pNext(A0),D0
  629.     BNE.S   fb_8
  630.  
  631.     CMP.L   A3,D2
  632.     BLE.S   fb_9
  633. ; Startposition nach unten korrigieren (Muster l„nger als Rest)
  634.     MOVE.L  A3,D2
  635.     BMI     f_false     ;neg. Startposition
  636. fb_9:
  637.     ADDA.L  D2,A1       ;Startposition im Text
  638.     MOVE.L  A1,D3
  639.     MOVE.L  tPattern.pFirst(A2),D0
  640. fb_0:
  641.     MOVEA.L D0,A0
  642.     MOVE.L  A1,tPat.pMatch(A0)  ;Zeiger auf Match
  643.     ADDA.W  tPat.len(A0),A1
  644.     MOVE.L  tPat.pNext(A0),D0
  645.     BNE.S   fb_0
  646.  
  647.     MOVEQ   #0,D4
  648.     MOVE.B  tPattern.any(A2),D3
  649.     JSR     Char.pUpper/
  650.     MOVEA.L D0,A4
  651.     MOVE.L  tPattern.pFirst(A2),A5
  652.     MOVE.L  D7,tPat.pLimit(A5)
  653.     MOVEQ   #0,D1
  654. fb_3:
  655.     MOVEA.L tPat.pMatch(A5),A2
  656.     LEA     tPat.d(A5),A3
  657.     MOVE.L  tPat.pLimit(A5),D7
  658.     TST.B   D1
  659.     BEQ.S   fb_2
  660.     MOVE.L  D7,A0
  661.     MOVE.B  tPat.eol(A5),D0
  662. fb_4:
  663.     CMP.B   (A0)+,D0
  664.     BEQ.S   fb_5
  665.     CMPA.L  A2,A0
  666. ;    BLO.S   fb_4
  667.     BCS.S   fb_4
  668.     BRA.S   fb_2
  669. fb_5:
  670.     LEA -1(A0),A2
  671. fb_2:
  672.     LEA     tPat.pattern(A5),A0
  673.     MOVE.L  A0,D6
  674.     ADDA.W  tPat.len(A5),A0
  675. ;    LEA     bcmpTable(PC),A0
  676. ;    MOVE.W  tPat.idx(A5),D0
  677. ;    ADDA.W  (A0,D0.W),A0
  678.  
  679.     LEA     bcmpTable(PC),A0
  680.     MOVE.W  tPat.idx(A5),D0
  681.     LSL.W   #1,D0
  682.     ADDA.W  D0,A0
  683.     MOVE.L  (A0),A0
  684.     JMP     (A0)
  685.  
  686. fb_7:
  687. ; keine šbereinstimmung
  688.     MOVE.L  tPat.pPrev(A5),D0
  689.     BEQ     f_false     ;kein Vorg„nger -> Suche erfolglos
  690.     MOVEA.L D0,A5
  691.     MOVEA.L tPat.pMatch(A5),A2
  692.     LEA     tPat.d(A5),A3
  693.     MOVE.L  tPat.pLimit(A5),D7
  694.     MOVE.B  (A2),D4
  695.     MOVE.B  0(A3,D4.W),D4
  696.     SUBA.W  D4,A2
  697.     CMPA.L  D7,A2
  698. ;    BLO.S   fb_7
  699.     BCS.S   fb_7
  700.     BRA.S   fb_2        ;Suche mit Vorg„nger fortsetzen
  701. fb_6:
  702. ; šbereinstimmung
  703.     MOVE.L  A2,tPat.pMatch(A5)
  704.     MOVE.L  tPat.pNext(A5),D0
  705.     BEQ     f_true      ;Alle Teilmuster passen
  706.     MOVEA.L A2,A0
  707.     ADDA.W  tPat.len(A5),A0
  708.     MOVE.B  tPat.no_eol(A5),D1
  709.     MOVE.L  D0,A5
  710.     MOVE.L  A0,tPat.pLimit(A5)
  711.     BRA.S   fb_3        ;Suche mit Nachfolger fortsetzen
  712.  
  713. Bwd:
  714. fb_14:
  715.     MOVEA.L A2,A0       ;Text
  716.     MOVEA.L D6,A1       ;Muster
  717. fb_15:
  718.     MOVE.B  (A1)+,D0
  719.     BEQ.S   fb_6        ;Muster stimmt mit Text berein
  720.     CMP.B   (A0)+,D0
  721.     BEQ.S   fb_15
  722.     MOVE.B  (A2),D4
  723.     MOVE.B  0(A3,D4.W),D4
  724.     SUBA.W  D4,A2
  725.     CMPA.L   D7,A2
  726. ;    BHS.S   fb_14
  727.     BCC.S   fb_14
  728.     BRA.S   fb_7
  729.  
  730. BwdCap:
  731. fb_24:
  732.     MOVEA.L A2,A0       ;Text
  733.     MOVEA.L D6,A1       ;Muster
  734. fb_25:
  735.     MOVE.B  (A1)+,D0
  736.     BEQ.S   fb_6        ;Muster stimmt mit Text berein
  737.     MOVE.B  (A0)+,D4
  738.     CMP.B   0(A4,D4.W),D0
  739.     BEQ.S   fb_25
  740.     MOVE.B  (A2),D4
  741.     MOVE.B  0(A3,D4.W),D4
  742.     SUBA.W  D4,A2
  743.     CMPA.L  D7,A2
  744. ;    bhs.S   fb_24
  745.     BCC.S   fb_24
  746.     BRA fb_7
  747.  
  748. BwdAny:
  749. fb_34:
  750.     MOVEA.L A2,A0       ;Text
  751.     MOVEA.L D6,A1       ;Muster
  752. fb_35:
  753.     MOVE.B  (A1)+,D0
  754.     BEQ fb_6        ;Muster stimmt mit Text berein
  755.     CMP.B   D0,D3
  756.     BEQ.S   fb_36       ;?
  757.     CMP.B   (A0)+,D0
  758.     BEQ.S   fb_35
  759.     MOVE.B  (A2),D4
  760.     MOVE.B  0(A3,D4.W),D4
  761.     SUBA.W  D4,A2
  762.     CMPA.L  D7,A2
  763. ;    bhs.S   fb_34
  764.     BCC.S   fb_34
  765.     BRA     fb_7
  766. fb_36:
  767.     ADDQ.W  #1,A0
  768.     BRA.S   fb_35
  769.  
  770. BwdCapAny:
  771. fb_44:
  772.     MOVEA.L A2,A0       ;Text
  773.     MOVEA.L D6,A1       ;Muster
  774. fb_45:
  775.     MOVE.B  (A1)+,D0
  776.     BEQ fb_6        ;Muster stimmt mit Text berein
  777.     MOVE.B  (A0)+,D4
  778.     CMP.B   D0,D3
  779.     BEQ.S   fb_45       ;?
  780.     CMP.B   0(A4,D4.W),D0
  781.     BEQ.S   fb_45
  782.     MOVE.B  (A2),D4
  783.     MOVE.B  0(A3,D4.W),D4
  784.     SUBA.W  D4,A2
  785.     CMPA.L  D7,A2
  786. ;    bhs.S   fb_44
  787.     BCC.S   fb_44
  788.     BRA fb_7
  789.  
  790. (*
  791. Original:
  792. fcmpTable:
  793.     DC.W Fwd-fcmp_table
  794.     DC.W FwdCap-fcmp_table
  795.     DC.W FwdAny-fcmp_table
  796.     DC.W FwdCapAny-fcmp_table
  797. bcmpTable:
  798.     DC.W Bwd-bcmp_table
  799.     DC.W BwdCap-bcmp_table
  800.     DC.W BwdAny-bcmp_table
  801.     DC.W BwdCapAny-bcmp_table
  802.  
  803. Neu:
  804. fcmpTable:
  805.     DC.L Fwd(PC)
  806.     DC.L FwdCap(PC)
  807.     DC.L FwdAny(PC)
  808.     DC.L FwdCapAny(PC)
  809. bcmpTable:
  810.     DC.L Bwd(PC)
  811.     DC.L BwdCap(PC)
  812.     DC.L BwdAny(PC)
  813.     DC.L BwdCapAny(PC)
  814. *)
  815. fcmpTable:
  816.     DC.L 0,0,0,0
  817. bcmpTable:
  818.     DC.L 0,0,0,0
  819.  
  820. f_endproc:
  821.     MOVEM.L (A7)+,D0-A6
  822.     END;
  823.     RETURN erg
  824.    END (*PROC *) Find;
  825.  
  826.  
  827. PROCEDURE Dispose (VAR pPattern: tpPattern);
  828. (*
  829. ;: PREFIX dis_;
  830. ;: REG A2;
  831. ;: LINK A6
  832. *)
  833.  VAR
  834.     pPat: tpPat;
  835.  
  836.  
  837.    BEGIN (* PROC Dispose *)
  838.     ASSEMBLER
  839.     MOVE.L  pPattern(A6),A0
  840.     TST.L   (A0)
  841.     BEQ.S   dis_5
  842.     MOVE.L  (A0),A0
  843.     MOVE.L  tPattern.pFirst(A0),A2
  844. dis_0:
  845.     MOVE.L  A2,pPat(A6)
  846.     BEQ.S   dis_3
  847.     MOVE.L  tPat.pNext(A2),A2
  848.     LEA     pPat(A6),A0
  849.     MOVE.L  A2,-(SP)
  850.     MOVE.L  A0,(A3)+
  851.     CLR.L   (A3)+
  852.     JSR     Storage.DEALLOCATE
  853.     MOVE.L  (SP)+,A2
  854.     
  855. ;    PEA     dis_pPat(A6)
  856. ;    CALL    Storage.Free
  857.     BRA.S   dis_0
  858. dis_3:
  859.     MOVE.L  pPattern(A6),(A3)+
  860.     CLR.L   (A3)+
  861.     JSR     Storage.DEALLOCATE
  862. ;    push.L  dis_pPattern(dis_par)
  863. ;    CALL    Storage.Free
  864. dis_5:
  865.     END;
  866.    END (* PROC *) Dispose;
  867.  
  868.  
  869. END Find2.                                        
  870.    
  871.  
  872.